﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SegIdenMovilBT.Entidad;
using SegIdenMovilBT.Herramientas;
using GS1.Library;
using SegIdenMovilBT.Delegate;

namespace SegIdenMovilBT
{
    public partial class frmVenta : Form
    {
        #region --- Variables y Constantes ---
        public Venta venta { get; set; }

        private Cliente clienteSeleccionado = null;
        #endregion

        #region --- Constructor ---
        public frmVenta()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmVenta_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            elegirCliente();
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir(DialogResult.Cancel);
        }

        private void mnuContinuar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void txtClienteNroDocumento_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { buscarCliente(); }
        }

        private void txtClienteNroDocumento_TextChanged(object sender, EventArgs e)
        {
            limpiarDatosCliente();
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaMoneda = null;
            ListaGeneral listaTipoDocumento = null;
            ListaGeneral listaTipoDocVenta = null;
            ListaGeneral listaFormaVenta = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Mostrar descripcion de tienda
                this.lblEtiquetaTienda.Text = ParametrosAplicacion.TIENDA_ACTUAL.descripcion;

                // Instanciando y creando listado de monedas
                listaMoneda = new ListaGeneral();
                listaMoneda.Add(new General { codigo = Constantes.CODIGO_MONEDA_DOLARES, descripcion = Constantes.DESCRIPCION_MONEDA_DOLARES });

                // Estableciendo parametros del Combo Moneda
                this.cboMoneda.DataSource = listaMoneda;
                this.cboMoneda.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboMoneda.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboMoneda.SelectedIndex = 0;

                // Instanciando y creando listado de tipo doc de venta
                listaTipoDocVenta = new ListaGeneral();
                listaTipoDocVenta.Add(new General { codigo = Constantes.CODIGO_TIPO_VENTA_BOLETA, descripcion = Constantes.DESCRIPCION_TIPO_VENTA_BOLETA });
                listaTipoDocVenta.Add(new General { codigo = Constantes.CODIGO_TIPO_VENTA_FACTURA, descripcion = Constantes.DESCRIPCION_TIPO_VENTA_FACTURA });

                // Estableciendo parametros del combo Tipo doc venta
                this.cboTipoDocVenta.DataSource = listaTipoDocVenta;
                this.cboTipoDocVenta.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocVenta.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocVenta.SelectedIndex = 0;

                // Instanciando y creando listado de forma de pago
                listaFormaVenta = new ListaGeneral();
                listaFormaVenta.Add(new General { codigo = Constantes.CODIGO_FORMA_VENTA_CONTADO, descripcion = Constantes.DESCRIPCION_FORMA_VENTA_CONTADO });
                listaFormaVenta.Add(new General { codigo = Constantes.CODIGO_FORMA_VENTA_CREDITO, descripcion = Constantes.DESCRIPCION_FORMA_VENTA_CREDITO });

                // Estableciendo parametros del combo forma de pago
                this.cboFormaVenta.DataSource = listaFormaVenta;
                this.cboFormaVenta.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboFormaVenta.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboFormaVenta.SelectedIndex = 0;

                // Instanciando y creando listado de documentos
                listaTipoDocumento = new ListaGeneral();
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_DNI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_RUC, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CE, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI });

                // Estableciendo parametros del combo Tipo documento
                this.cboTipoDocumento.DataSource = listaTipoDocumento;
                this.cboTipoDocumento.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocumento.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocumento.SelectedIndex = 0;

                this.txtSerie.Focus();
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void elegirCliente()
        {
            using (frmListado frmListado = new frmListado())
            {
                frmListado.TipoListado = frmListado.TipoLista.CLIENTE;
                if (frmListado.ShowDialog() == DialogResult.Cancel) { frmListado.Dispose(); return; }

                this.clienteSeleccionado = (Cliente)frmListado.ItemSeleccionado;
                this.cboTipoDocumento.SelectedValue = this.clienteSeleccionado.tipoDocumento;
                this.txtClienteNroDocumento.Text = this.clienteSeleccionado.nroDocumento;
                this.txtClienteRazonSocial.Text = this.clienteSeleccionado.razonSocial;
                frmListado.Dispose();
            }
        }

        private bool validarEntradaBusqueda()
        {
            this.txtClienteNroDocumento.Text = this.txtClienteNroDocumento.Text.Trim();

            if (this.txtClienteNroDocumento.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtClienteNroDocumento, "Debes ingresa el número de documento", this.Text);
                return true;
            }

            if (this.txtClienteNroDocumento.TextLength < 3)
            {
                Util.CampoNecesario(this.txtClienteNroDocumento, "Debe ingresar por lo menos 3 caracteres para realizar la busqueda", this.Text);
                return true;
            }

            return false;
        }

        private void buscarCliente()
        {
            object resultado = null;
            Operacion operacion = null;

            try
            {
                if (validarEntradaBusqueda()) { return; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_CLIENTE_PORDOCUMENTO;

                operacion.cliente = new Cliente();
                operacion.cliente.tipoDocumento = this.cboTipoDocumento.SelectedValue.ToString();
                operacion.cliente.nroDocumento = this.txtClienteNroDocumento.Text;

                // Instanciando y ejecutando llamada al ServicioLocal
                using (ConexionLocal conexionLocal = new ConexionLocal())
                {
                    resultado = conexionLocal.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Cliente
                Cliente cliente = (Cliente)resultado;

                // Limpiando datos del cliente anterior
                limpiarDatosCliente();

                // Si el cliente existe
                if (cliente != null)
                {
                    if (cliente.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO))
                    {
                        Util.ShowMessageboxExclamacion("Este cliente se encuentra en estado inactivo", this.Text);
                        return;
                    }

                    // Establecer su razon social
                    this.clienteSeleccionado = cliente;
                    this.txtClienteRazonSocial.Text = clienteSeleccionado.razonSocial;
                }
                else
                {
                    Util.ShowMessageboxExclamacion("El cliente buscado no existe", this.Text);
                    return;
                }
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void limpiarDatosCliente()
        {
            // Limpiando datos del cliente anterior
            this.txtClienteRazonSocial.Text = string.Empty;
        }

        private bool validarEntrada()
        {
            this.txtClienteRazonSocial.Text = this.txtClienteRazonSocial.Text.Trim();

            if (this.cboTipoDocumento.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_FACTURA))
            {
                if (this.txtClienteRazonSocial.Text.Equals(string.Empty))
                {
                    Util.CampoNecesario(this.txtClienteNroDocumento, "Debes seleccionar o buscar el cliente", this.Text);
                    return true;
                }
            }

            if (this.cboTipoDocVenta.SelectedIndex == -1)
            {
                Util.CampoNecesario(this.cboTipoDocVenta, "Debe seleccionar un tipo doc venta", this.Text);
                return true;
            }

            if (this.cboMoneda.SelectedIndex == -1)
            {
                Util.CampoNecesario(this.cboMoneda, "Debe seleccionar una moneda", this.Text);
                return true;
            }

            return false;
        }

        private void grabar()
        {
            object resultado = null;
            Operacion operacion = null;

            try
            {
                if (validarEntrada()) { return; }

                if (!Util.ShowMessageboxPregunta("¿Esta seguro de guardar la venta?", this.Text)) { return; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_VENTA;

                venta.codVenta = Constantes.VALOR_CERO;

                // Estableciendo serie y numero de venta
                venta.serie = this.txtSerie.Text;
                venta.numero = this.txtNumero.Text;
                venta.notaCreditoNumero = this.txtNotaCreditoNumero.Text;
                venta.notaCreditoSerie = this.txtNotaCreditoSerie.Text;

                // Estableciendo cliente
                if (this.cboTipoDocumento.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_BOLETA))
                {
                    if (!this.txtClienteRazonSocial.Text.Equals(string.Empty))
                    {
                        venta.cliente = new Cliente();
                        venta.cliente.codCliente = this.clienteSeleccionado.codCliente;
                    }
                }
                else
                {
                    venta.cliente = new Cliente();
                    venta.cliente.codCliente = this.clienteSeleccionado.codCliente;
                }
                // Estableciendo el tipo de documento de venta
                venta.tipoDocumentoVenta = new TipoDocumentoVenta();
                venta.tipoDocumentoVenta.codigo = this.cboTipoDocVenta.SelectedValue.ToString();

                // Estableciendo tipo de moneda
                venta.moneda = new Moneda();
                venta.moneda.codigo = this.cboMoneda.SelectedValue.ToString();

                // Estableciendo forma de venta
                venta.formaVenta = new FormaVenta();
                venta.formaVenta.codigo = this.cboFormaVenta.SelectedValue.ToString();

                // Estableciendo usuario de registro
                venta.usuario = new Usuario();
                venta.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                // Estableciendo estado y fecha
                venta.estado = Constantes.ESTADO_VENTA_PENDIENTE;
                venta.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                //Estableciendo tienda de la venta
                venta.tienda = new Tienda();
                venta.tienda = ParametrosAplicacion.TIENDA_ACTUAL;
                
                //se cargan todos los datos de la venta en el objeto operacion
                operacion.venta = this.venta;

                // Instanciando y ejecutando llamada al ServicxxioLocal
                using (ConexionLocal conexionLocal = new ConexionLocal())
                {
                    resultado = conexionLocal.ejecutarOperacion(operacion);
                }

                OperacionResultado operacionResultado = (OperacionResultado)resultado;

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Util.ShowMessageboxInfo("Venta guardado correctamente");
                }
                else
                {
                    Util.ShowMessageboxError("No se guardo los datos");
                    return;
                }

                salir(DialogResult.OK);

            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void salir(DialogResult resultado)
        {
            this.DialogResult = resultado;
        }
        #endregion
    }
}